#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QtWidgets>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    v = new vigenere();
    keysCount = 0;
    ui->toolButton->setIcon(QIcon(":/Icons/open-folder-outline.png"));
}

MainWindow::~MainWindow()
{
    delete ui;
    delete v;
}

void MainWindow::reset_window(int radioButtonID)
{
    if (radioButtonID == 0)
    {
        ui->inputTextLabel->setText(tr("Tekst do zaszyfrowania..."));
        ui->encryptButton->setText(tr("Szyfruj"));
    }
    else
    {
        ui->inputTextLabel->setText(tr("Tekst do odszyfrowania..."));
        ui->encryptButton->setText(tr("Deszyfruj"));
    }
    ui->keyLengthLabel->setText((tr("Długość obecnego klucza: ")));
    ui->availableKeys->setText(tr("Dostępnych kluczy: "));
    ui->lineEdit->clear();
    ui->inputText->clear();
    ui->outputText->clear();
}

void MainWindow::on_toolButton_clicked()
{
    QString fileName = QFileDialog::getOpenFileName(
                this,
                tr("Otwórz plik z kluczami"),
                QCoreApplication::applicationFilePath(),
                "Plik klucza (*.txt);; Wszystkie pliki (*.*)"
                );
    if (!fileName.isEmpty() && !fileName.isNull())
    {
        delete v;
        v = new vigenere();
        if (fileName.contains(".txt") && v->load_keys_from_file(fileName.toLocal8Bit().constData()) == true)
        {
           ui->lineEdit->setText(fileName);
           keysCount = v->keys_count();
           ui->availableKeys->setText(tr("Dostępnych kluczy: %1").arg(keysCount));
           ui->encryptButton->setEnabled(true);
           ui->keyLengthLabel->setText(tr("Długość obecnego klucza: %1").arg(v->current_key_length()));
        }
        else
        {
            QMessageBox::information(this, tr("Błąd"), tr("Wystąpił błąd podczas otwierania pliku. Upewnij się, że załadowałeś poprawny plik z rozszerzeniem .txt"));
        }
    }
}

void MainWindow::on_encryptButton_clicked()
{
    if (keysCount > 0 )
    {
        if (ui->inputText->toPlainText().length() > 0)
        {
         ui->outputText->clear();
         if (ui->encryptionRadioButton->isChecked())
             ui->outputText->append(QString::fromStdString(v->encrypt(ui->inputText->toPlainText().toLocal8Bit().constData())));
         else
             ui->outputText->append(QString::fromStdString((v->decrypt(ui->inputText->toPlainText().toLocal8Bit().constData()))));
         keysCount--;
         ui->availableKeys->setText(tr("Dostępnych kluczy: %1").arg(keysCount));
         if (keysCount > 0)
             ui->keyLengthLabel->setText(tr("Długość obecnego klucza: %1").arg(v->current_key_length()));
         else
             ui->keyLengthLabel->setText(tr("Długość obecnego klucza: "));
        }
        else
            QMessageBox::information(this, tr("Błąd"), tr("Pole wprowadzania jest puste!"));
    }
    else
    {
        QMessageBox::information(this, tr("Błąd"), tr("Brak kluczy lub wszystkie klucze zużyte! Załaduj nowy plik z kluczami."));
        ui->keyLengthLabel->setText((tr("Długość obecnego klucza: ")));
    }
}

void MainWindow::on_inputText_textChanged()
{
    if (keysCount > 0 && v->current_key_length() < ui->inputText->toPlainText().length())
        ui->textLabel3->setText(tr("Uwaga! Długość tekstu jest większa od długości klucza."));
    else
        ui->textLabel3->clear();
}

void MainWindow::on_actionHelp_triggered()
{
    QString str = tr("Program do szyfrowania korzysta z polialfabetycznego szyfru Vigenère'a. Jego działanie opisuje artykuł dostępny pod linkiem <a href = \"https://pl.wikipedia.org/wiki/Szyfr_Vigen%C3%A8re%27a\">Wiki</a>.<br><br>"
"Dla większego bezpieczeństwa, upewnij się, że klucz nie jest używany więcej niż jeden raz oraz ma długość większą od długości tekstu jawnego.<br><br>"
"Program nie obsługuje polskich znaków (znaki polskie w kluczach zostaną zignorowane).");
    QMessageBox::about(this, tr("Pomoc"), str);
}

void MainWindow::on_actionExit_triggered()
{
    QApplication::quit();
}

void MainWindow::on_encryptionRadioButton_pressed()
{
    reset_window(0);
}

void MainWindow::on_decryptionRadioButton_pressed()
{
    reset_window(1);
}
